package xcache

import (
	"encoding/json"
	"strings"
	"time"

	"gitee.com/xiaoyutab/xgotool/xerror"
	"github.com/gomodule/redigo/redis"
)

// 获取key的值
//
//	key	要获取的key下标
func Get(key string) (string, error) {
	if v, ok := _default.CacheSync.Load(key); ok {
		return v.(string), nil
	}
	// 如果redis地址为空，则直接使用程序缓存
	if _default.Hosts == "" {
		return "", nil
	}
	open()
	defer close()
	if _default.Connect == nil {
		return "", nil
	}
	// 异常捕获
	defer panic_recover("get")
	val, err := redis.String(_default.Connect.Do("GET", key))
	if err != nil {
		if strings.Contains(err.Error(), "nil returned") {
			// 如果是缓存没命中的话，直接返回空
			return "", nil
		}
		return "", errorFunc("redis获取失败", err)
	}
	// 将数据存储到内存中
	_default.CacheSync.Store(key, val) // 存储到运行内存中
	// 定时移除
	go func() {
		time.Sleep(time.Hour * 1)
		_default.CacheSync.Delete(key)
	}()
	return val, nil
}

// 获取KEY设置的值
//
//	key	要获取的key下标
func GetString(key string) string {
	if v, err := Get(key); err == nil {
		if len(v) > 1 && v[0] == '"' {
			v = v[1 : len(v)-1]
		}
		return v
	}
	return ""
}

// 读取结构体
//
//	key	缓存的key名称
//	val	预期读取的类型【使用json串行化进行反解析】
func GetStruct(key string, val any) error {
	str := GetString(key)
	if str == "" {
		return xerror.New("缓存为空或缓存不存在")
	}
	return json.Unmarshal([]byte(str), val)
}
